package simple.tree;

import struct.Node;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

/**
 * 590. N 叉树的后序遍历
 * 给定一个 n 叉树的根节点 root ，返回 其节点值的 后序遍历 。
 * 提示：
 *   点总数在范围 [0, 104] 内
 *   0 <= Node.val <= 104
 *   n 叉树的高度小于或等于 1000
 * 进阶：递归法很简单，你可以使用迭代法完成此题吗?
 * @author 刘学松
 * @date 2022-03-13 0:32
 */
public class N叉树的后序遍历 {
    public List<Integer> postorder(Node root) {
        List<Integer> list = new ArrayList<>();
        recursion(root, list);
        return list;
    }

    public void recursion(Node node, List<Integer> list) {
        if (node != null) {
            if (node.children != null) {
                for (Node child : node.children) {
                    recursion(child, list);
                }
            }
            list.add(node.val);
        }
    }

    public List<Integer> iteration(Node root) {
        if (root == null) {
            return new ArrayList<>();
        }
        List<Integer> list = new ArrayList<>();
        Stack<Node> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            Node pop = stack.pop();
            list.add(pop.val);
            if (pop.children != null) {
                for (Node child : pop.children) {
                    stack.push(child);
                }
            }
        }
        Collections.reverse(list);
        return list;
    }
}
